#include <iostream>

class Base
{
public:
    virtual void show()  //虚函数
    {
        std::cout<<"Base\n";
    }
};

class Derived1:public Base
{
public:
    void show()
    {
        std::cout<<"Derived1\n";
    }
};

class Derived2:public Base
{
public:
    void show()  //子类函数和父类函数完全相同:重写
    {
        std::cout<<"Derived2\n";
    }
};

int main()
{
    Derived1 *d1 = new Derived1;
    Derived2 *d2 = new Derived2;

    // d1->show();
    // d2->show();

    //C++允许将子类指针转成基类指针:向上转型
    // Base *b1 = d1;
    // Base *b2 = d2;

    Base *b = d1;
    b->show();

    b = d2;
    b->show();

    //Derived1 *t = b1;   //向下转型:基类指针转成子类指针:不被允许

    //多态:同一句代码，不同的功能
    //C++多态:
    //1、基类指针指向子类对象
    //2、基类定义虚函数
    //3、子类重写父类虚函数

    //重写 和 名词遮蔽

    //虚函数为什么能实现多态
    //虚函数指针 和 虚函数表

    return 0;
}